<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style type="text/css">
      .container .cart {
        width: 300px;
        margin: auto;
      }

      .container .title {
        background-color: lightblue;
        height: 40px;
        line-height: 40px;
        text-align: center;
        /*color: #fff;*/
      }

      .container .total {
        background-color: #ffce46;
        height: 50px;
        line-height: 50px;
        text-align: right;
      }

      .container .total button {
        margin: 0 10px;
        background-color: #dc4c40;
        height: 35px;
        width: 80px;
        border: 0;
      }

      .container .total span {
        color: red;
        font-weight: bold;
      }

      .container .item {
        height: 55px;
        line-height: 55px;
        position: relative;
        border-top: 1px solid #add8e6;
      }

      .container .item img {
        width: 45px;
        height: 45px;
        margin: 5px;
      }

      .container .item .name {
        position: absolute;
        width: 90px;
        top: 0;
        left: 55px;
        font-size: 16px;
      }

      .container .item .price {
        position: absolute;
        width: 90px;
        top: 0;
        left: 95px;
        font-size: 16px;
      }

      .container .item .change {
        width: 100px;
        position: absolute;
        top: 0;
        right: 50px;
      }

      .container .item .change a {
        font-size: 20px;
        width: 30px;
        text-decoration: none;
        background-color: lightgray;
        vertical-align: middle;
      }

      .container .item .change .num {
        width: 40px;
        height: 25px;
      }

      .container .item .del {
        position: absolute;
        top: 0;
        right: 0px;
        width: 40px;
        text-align: center;
        font-size: 40px;
        cursor: pointer;
        color: red;
      }

      .container .item .del:hover {
        background-color: orange;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <div class="container">
        <my-cart></my-cart>
      </div>
    </div>
    <script type="text/javascript" src="./vue.js"></script>
    <script type="text/javascript">
      //标题局部组件
      var CartTitle = {
        template: `
        <div class="title">我的商品</div>
      `,
      };
      // 商品展示局部组件
      var CartList = {
        props: ["lists"],
        data() {
          return {};
        },
        template: `
        <div>
          <div v-for='(item,index) in lists' class="item">
            <img :src="item.img"/>
            <div class="name">{{item.name}}</div>
            <div class="price">{{item.price}}</div>
            <div class="change">
              <a href="#" @click.prevent = 'reduceNum(index)'>－</a>
              <input type="text" class="num" :value="item.num"/>
              <a href="#" @click.prevent = 'addNum(index)'>＋</a>
            </div>
            <div class="del" @click='delItem(index)'>×</div>
          </div>
        </div>
      `,
        methods: {
          delItem(i) {
            this.$emit("handler", i);
          },
          reduceNum(i) {
            this.$emit("reduceToFa", i);
          },
          addNum(i) {
            this.$emit("addToFa", i);
          },
        },
      };

      //  商品价格汇总
      var CartTotal = {
        props: ["total"],
        template: `
      <div class="total">
        <span>总价：{{total}}</span>
          <button>结算</button>
        </div>
      `,
      };

      Vue.component("my-cart", {
        template: `
          <div  class='cart'>  
            <cart-title></cart-title>
             <cart-list :lists='lists' @handler='delItem' @reduceToFa='reduceNum' @addToFa='addNum'></cart-list>
            <cart-total :total='total'></cart-total>
            </div>
       `,
        methods: {
          delItem(i) {
            this.lists.splice(i, 1);
          },
          reduceNum(i) {
            this.lists.some((item, index) => {
              if (index == i && item.num >= 1) item.num -= 1;
            });
          },
          addNum(i) {
            this.lists.some((item, index) => {
              if (index == i) item.num += 1;
            });
          },
        },
        data() {
          return {
            lists: []
          };
        },
        components: {
          CartTitle,
          CartList,
          CartTotal,
        },
        computed: {
          total() {
            return this.lists.reduce((oldval, newval) => oldval + newval.num * newval.price, 0);
          },
        },
        mounted() {
          fetch("./data/cart.json").then(res=>res.json()).then(res=>this.lists = res)
        }
      });

      var vm = new Vue({
        el: "#app",
        data: {},
      });
    </script>
  </body>
</html>
